/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package CONTABILIDAD_MODELO;


/**
 *
 * @author equipo_4
 */
public class CON_CODIGO_CONTROL 
{
    
    private static String big_base_convert(long numero, long baseconv) {
        char[] dic = new char[]{
                '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 
                'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 
                'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 
                'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 
                'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 
                'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 
                'y', 'z', '+', '/' };
       
        long cociente = 1;
        long resto = 0;
        
        String palabra = "";
        
        while (cociente > 0)
        {
                cociente = numero/baseconv;
                resto = numero%baseconv;
                palabra = dic[(int)resto]+palabra;
                numero = cociente;
        }
        return palabra;
    }
    
    private static String redondear(String valorn)
    {
        double valor = Double.parseDouble(valorn.trim());
        int valor2 = (int)valor;
        double decimals = valor-valor2;
        char primero = (decimals+"").charAt(2);
        int finals = Integer.parseInt(primero+"");
        if(finals>5)
        {
            valor = Math.ceil(valor);
            return (int)valor+"";
        }
        else
        {
            valor = Math.floor(valor);
            return (int)valor+"";
        }
    }
    
    public static String GetCodigo(String num_autorizacion, String num_factura, String nit_ci,String fecha, String monto, String llave)           
    {
        monto = monto.replaceAll(",", ".");
        monto = monto.replaceAll(" ", "");
        monto = redondear(monto);
        
        num_factura=num_factura.trim();
        num_factura += Verhoeff.generateVerhoeff(num_factura);
        num_factura += Verhoeff.generateVerhoeff(num_factura);
        
        nit_ci=nit_ci.trim();
        nit_ci += Verhoeff.generateVerhoeff(nit_ci);
        nit_ci += Verhoeff.generateVerhoeff(nit_ci);
        
        fecha=fecha.trim();
        fecha += Verhoeff.generateVerhoeff(fecha);
        fecha += Verhoeff.generateVerhoeff(fecha);
        
        
        monto += Verhoeff.generateVerhoeff(monto);
        monto += Verhoeff.generateVerhoeff(monto);
        
        Long suma = Long.parseLong(num_factura)+Long.parseLong(nit_ci)+Long.parseLong(fecha)+Long.parseLong(monto);
        
        String sumav = suma+"";
        String veroeff="";
        
        veroeff += Verhoeff.generateVerhoeff(sumav+"");;
        sumav += Verhoeff.generateVerhoeff(sumav+"");
        veroeff += Verhoeff.generateVerhoeff(sumav+"");
        sumav += Verhoeff.generateVerhoeff(sumav+"");
        veroeff += Verhoeff.generateVerhoeff(sumav+"");
        sumav += Verhoeff.generateVerhoeff(sumav+"");
        veroeff += Verhoeff.generateVerhoeff(sumav+"");
        sumav += Verhoeff.generateVerhoeff(sumav+"");
        veroeff += Verhoeff.generateVerhoeff(sumav+"");
        sumav += Verhoeff.generateVerhoeff(sumav+"");
        
        int largo1 = 0;        
        int largo2 = Integer.parseInt(veroeff.substring(0,1))+1;
        String cadena1 = llave.substring(largo1, largo1+largo2);
        
        largo1 = largo1+largo2;
        largo2 = Integer.parseInt(veroeff.substring(1,2))+1;
        String cadena2 = llave.substring(largo1, largo1+largo2);
        
        largo1 = largo1+largo2;
        largo2 = Integer.parseInt(veroeff.substring(2,3))+1;
        String cadena3 = llave.substring(largo1, largo1+largo2);
        
        largo1 = largo1+largo2;
        largo2 = Integer.parseInt(veroeff.substring(3,4))+1;
        String cadena4 = llave.substring(largo1, largo1+largo2);
        
        largo1 = largo1+largo2;
        largo2 = Integer.parseInt(veroeff.substring(4,5))+1;
        String cadena5 = llave.substring(largo1, largo1+largo2);
        
        num_autorizacion+=cadena1;
        num_factura+=cadena2;
        nit_ci+=cadena3;
        fecha+=cadena4;
        monto+=cadena5;
        
        llave=llave.trim();
        veroeff = veroeff.trim();
        
        String cadenaconcat = num_autorizacion+num_factura+nit_ci+fecha+monto;
        String llavesifrado = llave+veroeff;
        
        String llavefinalsifrado = AllegredRC4.encriptaSinguion(cadenaconcat, llavesifrado);
        
        int sumap1 = 0;
        int i = 0;
        while(i<llavefinalsifrado.length())
        {
            char letra = llavefinalsifrado.charAt(i);
            sumap1+=(int)letra;
            i+=5;
        }
        
        int sumap2 = 0;
        i = 1;
        while(i<llavefinalsifrado.length())
        {
            char letra = llavefinalsifrado.charAt(i);
            sumap2+=(int)letra;
            i+=5;
        }
        
        int sumap3 = 0;
        i = 2;
        while(i<llavefinalsifrado.length())
        {
            char letra = llavefinalsifrado.charAt(i);
            sumap3+=(int)letra;
            i+=5;
        }
        
        int sumap4 = 0;
        i = 3;
        while(i<llavefinalsifrado.length())
        {
            char letra = llavefinalsifrado.charAt(i);
            sumap4+=(int)letra;
            i+=5;
        }
        
        int sumap5 = 0;
        i = 4;
        while(i<llavefinalsifrado.length())
        {
            char letra = llavefinalsifrado.charAt(i);
            sumap5+=(int)letra;
            i+=5;
        }
        
        int sumaptotal = sumap1+sumap2+sumap3+sumap4+sumap5;
        
        
        int st1 = (sumaptotal*sumap1)/(Integer.parseInt(veroeff.charAt(0)+"")+1);
        int st2 = (sumaptotal*sumap2)/(Integer.parseInt(veroeff.charAt(1)+"")+1);
        int st3 = (sumaptotal*sumap3)/(Integer.parseInt(veroeff.charAt(2)+"")+1);
        int st4 = (sumaptotal*sumap4)/(Integer.parseInt(veroeff.charAt(3)+"")+1);
        int st5 = (sumaptotal*sumap5)/(Integer.parseInt(veroeff.charAt(4)+"")+1);
        
        int sumapbase = st1+st2+st3+st4+st5;
        String numero = sumapbase+"";
            
        String algo = big_base_convert(Long.parseLong(numero), 64);
        
        String codigo= AllegredRC4.encriptaSinguion(algo, llavesifrado);
        String finalizado ="";
        for(int j=0; j<codigo.length();j++)
        {
            finalizado+=codigo.charAt(j);
            if((j%2)!=0 && j<codigo.length()-1)
                finalizado+="-";
        }
        return finalizado;
    }
         
        
    
 
}
